/*
 * Created on Feb 20, 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package ar.edu.utn.frba.gdaia.src.action;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import ar.edu.utn.frba.gdaia.src.domain.Canal;

import ar.edu.utn.frba.gdaia.src.domain.ConceptoElemental;
import ar.edu.utn.frba.gdaia.src.externalinterface.Mensaje;
import ar.edu.utn.frba.gdaia.src.externalinterface.TextInterface;
import ar.edu.utn.frba.gdaia.src.main.Cerebro;
import ar.edu.utn.frba.gdaia.src.util.GDAIAUtil;

/**
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class ReadWordsCommand extends Command {

	/**
	 * Recibe: El cerebro con las colecciones existentes: CEREBRO Coleccion de
	 * palabras: PALABRAS NOTA: Aqui se recibe la orden de cerrar el sistema.
	 * Genera los conceptos de las palabras que desconoce.
	 */
	public void execute(Map parameters) {

		// se obtiene la entrada de la interfaz grafica
		TextInterface gui = (TextInterface) parameters.get(Command.INTERFACE_EXTERNA);

		Cerebro cerebro = (Cerebro) parameters.get(Command.CEREBRO);

		// TODO: OJO hay que considerar que puede ser un mensaje que no sea para
		// readwords 
		cerebro.setMensajeUIToMind((Mensaje) gui.getFromUIToMind());
		Mensaje mensaje = cerebro.getMensajeUIToMind();

		// verificamos que el canal de ingreso sea por teclado
		if (mensaje.getCanalIngreso() == Canal.TECLADO) {

			List listaDePalabras = (List) mensaje.getPayload();
			// analizo si es una correccion y reemplazo el token de correccion.
			verificarSiEsCorreccionYReemplazarToken(listaDePalabras, cerebro);

			List<ConceptoElemental> listaDeConceptosActuales = new ArrayList<ConceptoElemental>();

			// itero las palabras recibidas para crear los conceptos
			for (Iterator it1 = listaDePalabras.iterator(); it1.hasNext();) {
				String palabra = (String) it1.next();
				ConceptoElemental conceptoElemental = new ConceptoElemental(cerebro.getNextConceptNumber(), palabra, Canal.TECLADO, 0);
				
				if(!cerebro.getConceptos().contains(conceptoElemental))
					// agrego el concepto elemental encontrado
					cerebro.getConceptos().add(conceptoElemental);
				else
					conceptoElemental = GDAIAUtil.getConceptoByTemplate(cerebro, conceptoElemental);

				// agrego el concepto, a la lista
				// para utilizarla como filtro para
				// buscar si existe una situacion.
				listaDeConceptosActuales.add(conceptoElemental);
			}

			// seteamos la ultima lista de conceptos leidos.
			cerebro.setListaUltimosConceptosLeidos(listaDeConceptosActuales);
			// liberamos el Mensaje que vino desde la GUI
			cerebro.setMensajeUIToMind(null);
		}
	}

	/**
	 * @param listaDePalabras
	 * @param cerebro
	 */
	private void verificarSiEsCorreccionYReemplazarToken(List listaDePalabras,
			Cerebro cerebro) {
		for (Iterator it = listaDePalabras.iterator(); it.hasNext();) {
			String palabra = (String) it.next();
			if (palabra.startsWith(Command.FIX_KEYWORD)) {
				it.remove();
				cerebro.setCorrecion(true);
				return;
			}
		}
		// si llega, es porque no es correcion.
		cerebro.setCorrecion(false);
	}
}
